home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPARND.SA < prev    next >
Text File  |  1989-08-30  |  7KB  |  151 lines

  1.          TTL       FAST FLOATING POINT ASCII ROUND ROUTINE (FFPARND)
  2. ****************************************
  3. * (C) COPYRIGHT 1981 BY MOTOROLA INC.  *
  4. ****************************************
  5.  
  6. ***********************************************
  7. *                  FFPARND                    *
  8. *           ASCII ROUND SUBROUTINE            *
  9. *                                             *
  10. *  THIS ROUTINE IS NORMALLY CALLED AFTER THE  *
  11. *  'FFPFPA' FLOAT TO ASCII ROUTINE AND ACTS   *
  12. *  UPON ITS RESULTS.                          *
  13. *                                             *
  14. *  INPUT:  D6 - ROUNDING MAGNITUDE IN BINARY  *
  15. *               AS EXPLAINED BELOW.           *
  16. *          D7 - BINARY REPRESENTATION OF THE  *
  17. *               BASE 10 EXPONENT.             *
  18. *          SP ->  RETURN ADDRESS AND OUTPUT   *
  19. *                 FROM FFPFPA ROUTINE         *
  20. *                                             *
  21. *  OUTPUT: THE ASCII VALUE ON THE STACK IS    *
  22. *          CORRECTLY ROUNDED                  *
  23. *                                             *
  24. *          THE CONDITION CODES ARE UNDEFINED  *
  25. *                                             *
  26. *          ALL REGISTERS TRANSPARENT          *
  27. *                                             *
  28. *     THE ROUNDING PRECISION REPRESENTS THE   *
  29. *     POWER OF TEN TO WHICH THE ROUNDING WILL *
  30. *     OCCUR.  (I.E. A -2 MEANS ROUND THE DIGIT*
  31. *     IN THE HUNDREDTH POSITION FOR RESULTANT *
  32. *     ROUNDING TO TENTHS.)  A POSITIVE VALUE  *
  33. *     INDICATES ROUNDING TO THE LEFT OF THE   *
  34. *     DECIMAL POINT (0 IS UNITS, 1 IS TENS    *
  35. *     E.T.C.)                                 *
  36. *                                             *
  37. *     THE BASE TEN EXPONENT IN BINARY IS D7   *
  38. *     FROM THE 'FFPFPA' ROUTINE OR COMPUTED BY*
  39. *     THE CALLER.                             *
  40. *                                             *
  41. *     THE STACK CONTAINS THE RETURN ADDRESS   *
  42. *     FOLLOWED BY THE ASCII NUMBER AS FROM    *
  43. *     THE 'FFPFPA' ROUTINE.  SEE THE          *
  44. *     DESCRIPTION OF THAT ROUTINE FOR THE     *
  45. *     REQUIRED FORMAT.                        *
  46. *                                             *
  47. *  EXAMPLE:                                   *
  48. *                                             *
  49. *  INPUT PATTERN '+.98765432+01' = 9.8765432  *
  50. *                                             *
  51. *     ROUND +1 IS +.00000000+00 =  0.         *
  52. *     ROUND  0 IS +.10000000+02 = 10.         *
  53. *     ROUND -1 IS +.10000000+02 = 10.         *
  54. *     ROUND -2 IS +.99000000+01 =  9.9        *
  55. *     ROUND -3 IS +.98800000+01 =  9.88       *
  56. *     ROUND -6 IS +.98765400+01 =  9.87654    *
  57. *                                             *
  58. *  NOTES:                                     *
  59. *     1) IF THE ROUNDING DIGIT IS TO THE LEFT *
  60. *        OF THE MOST SIGNIFICANT DIGIT, A ZERO*
  61. *        RESULTS.  IF THE ROUNDING DIGIT IS TO*
  62. *        THE RIGHT OF THE LEAST SIGNIFICANT   *
  63. *        DIGIT, THEN NO ROUNDING OCCURS       *
  64. *     2) ROUNDING IS HANDY FOR ELIMINATING THE*
  65. *        DANGLING '999...' PROBLEM COMMON WITH*
  66. *        FLOAT TO DECIMAL CONVERSIONS.        *
  67. *     3) POSITIONS FROM THE ROUNDED DIGIT AND *
  68. *        TO THE RIGHT ARE SET TO ZEROES.      *
  69. *     4) THE EXPONENT MAY BE AFFECTED.        *
  70. *     5) ROUNDING IS FORCED BY ADDING FIVE.   *
  71. *     6) THE BINARY EXPONENT IN D7 MAY BE     *
  72. *        PRE-BIASED BY THE CALLER TO PROVIDE  *
  73. *        ENHANCED EDITING CONTROL.            *
  74. *     7) THE RETURN ADDRESS IS REMOVED FROM   *
  75. *        THE STACK UPON EXIT.                 *
  76. ***********************************************
  77.          PAGE
  78. FFPARND  IDNT      1,1       FFP ASCII ROUND SUBROUTINE
  79.  
  80.          XDEF      FFPARND   ENTRY POINT
  81.  
  82.          SECTION   9
  83.  
  84. FFPARND  MOVEM.L   D7/A0,-(SP)         SAVE WORK ON STACK
  85.          SUB.W     D6,D7               COMPUTE ROUNDING DIGIT OFFSET
  86.          BLE.S     FAFZRO              BRANCH IF LARGER THAN VALUE
  87.          CMP.W     #8,D7               INSURE NOT PAST LAST DIGIT
  88.          BHI       FARTN               RETURN IF SO
  89.          LEA       8+4+1(SP,D7),A0       POINT TO ROUNDING DIGIT
  90.          CMP.B     #'5',(A0)           ? MUST ROUND UP
  91.          BCC.S     FADORND             YEP - GO ROUND
  92.          SUB.W     #1,D7               ? ROUND LEADING DIGIT ZERO (D7=1)
  93.          BNE.S     FAZEROL             NOPE, JUST ZERO OUT
  94. FAFZRO   LEA       8+4+2(SP),A0        FORCE ZEROES ALL THE WAY ACROSS
  95.          MOVE.L    #'E+00',8+4+10(SP)  FORCE ZERO EXPONENT
  96.          MOVE.B    #'+',8+4(SP)        ZERO IS ALWAYS POSITIVE
  97.          BRA.S     FAZEROL            ZERO MANTISSA THEN RETURN
  98.  
  99. * ROUND UP MUST OCCUR
  100. FADORND  MOVE.L    A0,-(SP)            SAVE ZERO START ADDRESS ON STACK
  101. FACARRY  CMP.B     #'.',-(A0)          ? HIT BEGINNING
  102.          BEQ.S     FASHIFT             YES, MUST SHIFT DOWN
  103.          ADD.B     #1,(A0)             UP BY ONE
  104.          CMP.B     #'9'+1,(A0)         ? PAST NINE
  105.          BNE.S     FAZERO              NO, NOW ZERO THE END
  106.          MOVE.B    #'0',(A0)           FORCE ZERO FOR OVERFLOW
  107.          BRA       FACARRY             LOOP FOR CARRY
  108.  
  109. * OVERFLOW PAST TOP DIGIT - SHIFT RIGHT AND UP EXPONENT
  110. FASHIFT  ADD.L     #1,(SP)             ZERO PADD STARTS ONE LOWER NOW
  111.          ADD.L     #1,A0               BACK TO LEADING DIGIT
  112.          MOVE.L    #$31,D7             DEFAULT FIRST DIGIT ASCII ONE
  113.          SWAP.W    D7                  INITIALIZE OLD DIGIT
  114.          MOVE.B    (A0),D7             PRE-LOAD CURRENT DIGIT
  115. FASHFTR  SWAP.W    D7                  TO PREVIOUS DIGIT
  116.          MOVE.B    D7,(A0)+            STORE INTO THIS POSITION
  117.          MOVE.B    (A0),D7             LOAD UP NEXT DIGIT
  118.          CMP.B     #'E',D7             ? THE END
  119.          BNE.S     FASHFTR             NO, SHIFT ANOTHER TO THE RIGHT
  120.  
  121. * INCREMENT EXPONENT FOR SHIFT RIGHT
  122.          CMP.B     #'+',1(A0)          ? POSITIVE EXPONENT
  123.          ADD.L     #3,A0               POINT TO LEAST EXP DIGIT
  124.          BNE.S     FANGEXP             BRANCH NEGATIVE EXPONENT
  125.          ADD.B     #1,(A0)             ADD ONE TO EXPONENT
  126.          CMP.B     #'9'+1,(A0)         ? OVERFLOW PAST NINE
  127.          BNE.S     FAZERO              NO, NOW ZERO
  128.          ADD.B     #1,-(A0)            CARRY TO NEXT DIGIT
  129.          BRA.S     FAZERO              AND NOW ZERO END
  130. FANGEXP  CMP.W     #'01',-1(A0)        ? GOING FROM -1 TO +0
  131.          BNE.S     FANGOK              BRANCH IF NOT
  132.          MOVE.B    #'+',-2(A0)         CHANGE MINUS TO PLUS
  133. FANGOK   SUB.B     #1,(A0)             SUBTRACT ONE FROM EXPONENT
  134.          CMP.B     #'0'-1,(A0)         ? UNDERFLOW BELOW ZERO
  135.          BNE.S     FAZERO              NO, ZERO REMAINDER
  136.          SUB.B     #1,-(A0)            BORROW FROM NEXT DIGIT
  137.  
  138. * ZERO THE DIGITS PAST PRECISION REQUIRED
  139. FAZERO   MOVE.L    (SP)+,A0            RELOAD SAVED PRECISION
  140. FAZEROL  CMP.B     #'E',(A0)           ? AT END
  141.          BEQ.S     FARTN               BRANCH IF SO
  142.          MOVE.B    #'0',(A0)+          ZERO NEXT DIGIT
  143.          BRA.S     FAZEROL             AND TEST AGAIN
  144.  
  145. * RETURN TO THE CALLER
  146. FARTN    MOVEM.L   (SP)+,D7/A0         RESTORE REGISTERS
  147.          RTS                           RETURN TO CALLER
  148.  
  149.          END
  150.  
  151.